package com.jxlc.framework.oauth2.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jxlc.common.constant.Constants;
import com.jxlc.common.core.redis.TokenRedisCache;
import com.jxlc.common.utils.DateUtils;
import com.jxlc.common.utils.uuid.IdUtils;
import com.jxlc.framework.oauth2.domain.OAuth2AccessToken;
import com.jxlc.framework.oauth2.domain.dto.AccessTokenDto;
import com.jxlc.framework.oauth2.mapper.FieldOAuth2AccessTokenMapper;
import com.jxlc.framework.oauth2.service.FieldOAuth2AccessTokenService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;

/**
 *
 * OAuth2.0 Token Service 实现类
 *
 */
@Service
public class FieldOAuth2AccessTokenServiceImpl extends ServiceImpl<FieldOAuth2AccessTokenMapper, OAuth2AccessToken>
		implements FieldOAuth2AccessTokenService {

	@Resource
	private TokenRedisCache tokenRedisCache;

	@Override
	public OAuth2AccessToken createToken(AccessTokenDto dto) {
		OAuth2AccessToken accessToken = new OAuth2AccessToken();
		accessToken.setAccessToken(IdUtils.fastSimpleUUID());
		accessToken.setRefreshToken(dto.getRefreshToken());
		accessToken.setUserId(dto.getUserId());
		accessToken.setClientId(dto.getClientId());
		accessToken.setCreateTime(LocalDateTime.now());
		accessToken.setLoginType(dto.getLoginType());
		if (dto.getExpiresTime() == null) {
			dto.setExpiresTime(30);//默认半小时有效期
		}
		accessToken.setExpiresTime(accessToken.getCreateTime().plusMinutes(dto.getExpiresTime()));
		this.save(accessToken);

		if (dto.isEnableCache()) {
			tokenRedisCache.setToken(accessToken.getAccessToken(), dto.getCacheObj(), dto.getExpiresTime());
		}
		return accessToken;
	}

	@Override
	public List<OAuth2AccessToken> getByClient(Long clientId) {
		return this.list(new LambdaQueryWrapper<OAuth2AccessToken>()
				.eq(OAuth2AccessToken::getClientId, clientId)
				.le(OAuth2AccessToken::getExpiresTime, DateUtils.getTime()));
	}

	@Override
	public OAuth2AccessToken getByAccessToken(String accessToken) {
		return this.getOne(new LambdaQueryWrapper<OAuth2AccessToken>()
				.eq(OAuth2AccessToken::getAccessToken, accessToken)
				.last(Constants.LIMIT_ONE));
	}

	@Override
	public List<OAuth2AccessToken> getByRefreshToken(String refreshToken) {
		return this.list(new LambdaQueryWrapper<OAuth2AccessToken>()
						.eq(OAuth2AccessToken::getRefreshToken, refreshToken));
	}

	@Override
	public void delByAccessToken(String token) {
		OAuth2AccessToken accessToken = this.getByAccessToken(token);
		if (accessToken != null) {
			this.removeById(accessToken.getId());
		}
	}

	@Override
	public List<OAuth2AccessToken> getList(Long userId) {
		return this.list(new LambdaQueryWrapper<OAuth2AccessToken>()
				.eq(userId != null, OAuth2AccessToken::getUserId, userId)
				.ge(OAuth2AccessToken::getExpiresTime, LocalDateTime.now())
				.orderByDesc(OAuth2AccessToken::getId));
	}

}
